架子包括:
![[001.multi-repo vs mono-repo.excalidraw]]
一般 Mono-repo 的目录如下所示,在 packages 存放多个子项目,并且每个子项目都有自己的 package.json:
├── packages
| ├── pkg1
| | ├── package.json
| ├── pkg2
| | ├── package.json
├── package.json
参考资料:现代前端工程为什么越来越离不开 Monorepo?
我们要实现的 React 分为很多包,如:
react、react-dom、react-reconciler等,它们关系密切,需要互相调用,所以采用 Mono-repo 组织项目。
简单工具:
专业工具:
pnpm 相比其他打包工具的优势:
参考资料:pnpm 是凭什么对 npm 和 yarn 降维打击的?
我们采用 pnpm 作为包管理工具,Mono-repo 落地选用 pnpm workspace
git init # 初始化 git 仓库
npm install -g pnpm
pnpm init # 创建 package.json
.gitignore:
.DS_Store
node_modules
dist
# pnpm-workspace.yaml
packages:
- 'packages/*'
安装:pnpm i -D -w eslint
初始化:
pnpm exec eslint --init # 或:npx eslint --init
? How would you like to use ESLint?
# To check syntax and find problems
# ESLint 只做检查语法 + 发现问题,代码风格交给 Prettier
? What type of modules does your project use?
# JavaScript modules (import/export)
? Which framework does your project use?
# None of these
? Does your project use TypeScript?
# Yes
? Where does your code run?
# Browser ✅
# Node ✅
? Would you like to install them now?
# No
# 我们自己安装,因为它安装不加 -w,会报错
pnpm i -D -w globals @eslint/js typescript-eslint
生成的 eslint.config.mjs:
import globals from 'globals'
import pluginJs from '@eslint/js'
import tsEslint from 'typescript-eslint'
export default [
{ languageOptions: { globals: { ...globals.browser, ...globals.node } } },
pluginJs.configs.recommended,
...tsEslint.configs.recommended,
]
为 lint 增加对应的执行脚本:
"lint": "eslint --fix --quiet ./packages"
安装:pnpm i -D -w prettier
新建配置文件 .prettierrc.json:
{
"semi": false,
"singleQuote": true,
"printWidth": 120,
"useTabs": false,
"tabWidth": 2,
"bracketSpacing": true,
"trailingComma": "all",
"arrowParens": "avoid"
}
[[007.集成 Prettier|Prettier 集成到 ESLint]]:
eslint-config-prettier:关闭所有与 Prettier 冲突的 ESLint 规则eslint-plugin-prettier:将 Prettier 作为 ESLint 规则来运行,这样在运行 ESLint 时也会运行 Prettierpnpm i eslint-config-prettier eslint-plugin-prettier -D -w
为 style 增加对应的执行脚本:
"format": "prettier --write ./packages"
安装 Prettier 与 ESLint 的 VSCode 插件,并设置为保存后自动执行:Format On Save
通过 commitlint 对 git commit 提交信息进行检查,安装必要的库:
pnpm i -D -w @commitlint/cli @commitlint/config-conventional
新建配置文件 commitlint.config.mjs:
export default {
extends: ['@commitlint/config-conventional'],
}
conventional 规范集意义:
type(scope?): subject
# 类型(范围): 主题
# 范围是可选的,支持多个范围,用 "/"、"\"、"," 分割
type 值:
feat:添加新功能fix:修复 Bugdocs:文档的修改style:不影响代码含义的更改refactor:代码重构perf:性能方面的优化test:添加缺失的测试或更正现有测试build:影响构建系统或外部依赖项的更改ci:更改 CI 配置文件和脚本chore:一些不影响功能的更改(杂项)revert:恢复之前的提交安装:pnpm i -D -w husky lint-staged
git commit 命令初始化 husky:
pnpm exec husky init
.husky/pre-commit:
pnpm exec lint-staged
.husky/commit-msg:
npx --no-install commitlint --edit "$1"
package.json:
{
"scripts": {
"prepare": "husky",
"lint": "eslint --fix --quiet ./packages",
"format": "prettier --write ./packages"
},
"lint-staged": {
"./packages/**/*.{js,jsx,ts,tsx}": [
"prettier --write",
"eslint --fix --quiet"
]
},
}
比较不同打包工具的区别,我们要开发的项目的特点:
所以选择 rollup,安装:pnpm i -D -w rollup